/*
 * C�digo-fonte do livro "Programando Java para Web"
 * Autores: D�cio Heinzelmann Luckow <decioluckow@gmail.com>
 *          Alexandre Altair de Melo <alexandremelo.br@gmail.com>
 *
 * ISBN: 978-85-7522-238-6
 * http://www.novatec.com.br/livros/javaparaweb
 * Editora Novatec, 2010 - todos os direitos reservados
 *
 * LICEN�A: Este arquivo-fonte est� sujeito a Atribui��o 2.5 Brasil, da licen�a Creative Commons,
 * que encontra-se dispon�vel no seguinte endere�o URI: http://creativecommons.org/licenses/by/2.5/br/
 * Se voc� n�o recebeu uma c�pia desta licen�a, e n�o conseguiu obt�-la pela internet, por favor,
 * envie uma notifica��o aos seus autores para que eles possam envi�-la para voc� imediatamente.
 *
 *
 * Source-code of "Programando Java para Web" book
 * Authors: D�cio Heinzelmann Luckow <decioluckow@gmail.com>
 *          Alexandre Altair de Melo <alexandremelo.br@gmail.com>
 *
 * ISBN: 978-85-7522-238-6
 * http://www.novatec.com.br/livros/javaparaweb
 * Editora Novatec, 2010 - all rights reserved
 *
 * LICENSE: This source file is subject to Attribution version 2.5 Brazil of the Creative Commons
 * license that is available through the following URI:  http://creativecommons.org/licenses/by/2.5/br/
 * If you did not receive a copy of this license and are unable to obtain it through the web, please
 * send a note to the authors so they can mail you a copy immediately.
 *
 */
package com.livro.capitulo3.filme;

import com.livro.capitulo3.util.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class FilmeDAOHql implements FilmeDAO {

    private Session sessao;
    private Transaction transacao;

    public void salvar(Filme filme) {
        sessao = null;
        transacao = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.save(filme);
            transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Não foi possível inserir o filme. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a operação de insersão. Mensagem: " + e.getMessage());
            }
        }
    }

    public void atualizar(Filme filme) {
        sessao = null;
        transacao = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.update(filme);
            transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Não foi possível alterar o filme. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a operação de atualização. Mensagem: " + e.getMessage());
            }
        }
    }

    public void excluir(Filme filme) {
        sessao = null;
        transacao = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.delete(filme);
            transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Não foi possível excluir o filme. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a operação de exclusão. Mensagem: " + e.getMessage());
            }
        }
    }

    public Filme buscaFilme(Integer codigo) {
       Filme filme = null;
        sessao = null;
        transacao = null;
        Query consulta = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Filme where filme = :parametro");
            consulta.setInteger("parametro", codigo);
            filme = (Filme) consulta.uniqueResult();
            transacao.commit();
            return filme;
        } catch (HibernateException e) {
            System.out.println("Não foi possível buscar filme. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de busca. Mensagem: " + e.getMessage());
            }
        }
        return filme;
    }
    

    public List<Filme> listar() {
        sessao = null;
        transacao = null;
        Query consulta = null;
        List<Filme> resultado = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Filme fi order by fi.categoria");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar filme. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }    
}
